import xlsx from 'node-xlsx';
/**
 * 导出
 * @param list [{}]   数据
 * @param headers     表头信息
 * @param headerKeys  与表头对应的数据区key
 * @param tableName   导出的表名称
 */
export const excelExport = (list:any[], headers:string[], headerKeys:string[], tableName = 'excel') => {
    //excel通用样式
    const sheetOptions = { '!cols': [] };
    headers.forEach(() => {
        sheetOptions['!cols'].push({
            wch: 20
        })
    });
    const data = [];
    list.forEach(item => {
        let arr = [];
        const item2 = flatten(item);
        headerKeys.forEach((key:string)=>{
            if(item[key]){
                arr.push(item[key])
            }else{
                arr.push(item2[key])
            }
        })
        data.push(arr)
    })
    data.unshift(headers);
    const buffer = xlsx.build(
        [{ options: {}, name: `${tableName}_${new Date().valueOf()}`, data: data }],
        { sheetOptions }
    )
    return buffer
}
// userHeader: [
//     '用户序号',
//     '登录名称',
//     '用户邮箱',
//     '手机号码',
//     '用户性别',
//     '帐号状态',
//     '最后登录IP',
//     '最后登录时间',
//     '部门名称',
//     '部门负责人'
// ],
// userHeaderKeys: [
//     'userId',
//     'userName',
//     'email',
//     'phonenumber',
//     'sex',
//     'status',
//     'loginIp',
//     'loginDate',
//     'dept.deptName',
//     'dept.leader'
// ]

/**
 * 对象扁平化
 */
export const flatten = (obj) => {
    let result = {}
    let process = (key, value) => {
        // 首先判断是基础数据类型还是引用数据类型
        if (Object(value) !== value) {
            // 基础数据类型
            if (key) {
                result[key] = value
            }
        } else if (Array.isArray(value)) {
            for (let i = 0; i < value.length; i++) {
                process(`${key}[${i}]`, value[i])
            }
            if (value.length === 0) {
                result[key] = []
            }
        } else {
            let objArr = Object.keys(value)
            objArr.forEach((item) => {
                process(key ? `${key}.${item}` : `${item}`, value[item])
            })
            if (objArr.length === 0 && key) {
                result[key] = {}
            }
        }
    }
    process('', obj)
    return result
}

